home *** CD-ROM | disk | FTP | other *** search
- ; Subroutine.: PRINTREF.ASM
- ; Author.....: Roy M. Moore
- ; Date.......: 11/01/83
- ; Notice.....: Copyright 1983, All Rights Reserved
- ; Notes......: Locates delimiters of a character string.
- ; Used with PRINTREF.CMD
- ;
- ;
- ORG 42000
- SAVPOS DB 0 ; PREVIOUS PARSED POSITION IN STRING
- EOSFLG DB 0 ; END-OF-STRING FLAG
- OFFSET DB 0 ; OFFSET POSITION INTO THE STRING
- ERRFLG DB 0 ; ERROR FLAG
- ;
- ORG 42005 ; START OF ROUTINE
- ;
- SHLD SAVEHL ; SAVE H-L REGISTERS
- MOV A,M ; STORE STRING LENGTH TO ACCUM.
- STA STRLEN ; SAVE LENGTH + 1
- LDA SAVPOS ; FETCH PREVIOUS PARSED POSITION
- MOV C,A ; INITIALIZE B-C REGISTER PAIR
- MVI B,0 ;
- DAD B ; ADD B-C VALUE TO H-L REG PAIR
- XCHG ; POINT D-E AT STRING
- LDA STRLEN ; FETCH STRING LENGTH
- MOV B,A ; SAVE STRING LENGTH TO B-REG
- ;
- GETCH:
- INX D ; GET NEXT CHAR IN D-E ADDRESS
- INR B ; INCREMENT STRING COUNTER
- LDA STRLEN ; LOAD THE STRING LENGTH
- CMP B ; IS IT END-OF-STRING?
- JNZ GETCH2 ; NO, CHECK FOR STRING DELIMITERS
- CALL SETOFF ; SAVE OFFSET POSITION
- JMP FINSTR ; FINISHED
- ;
- ; FIND CHARACTER STRING DELIMITERS. "...", '...', [...]
- ;
- GETCH2:
- LDAX D ; LOAD ACCUMULATOR WITH CHAR
- CPI 22H ; IS IT "
- JZ STRDEL ; YES, FIND NEXT "
- CPI 27H ; IS IT '
- JZ STRDEL ; YES, FIND NEXT '
- CPI '[' ; IS IT [
- JNZ CHKDEL
- MOV C,']' ; YES, FIND ]
- ;
- ; FIND THE NEXT STRING DELIMITER.
- ;
- STRDEL:
- MOV C,A ; SAVE THE DELIMITER IN C-REG
- INX D ; POINT TO NEXT CHAR
- INR B ; ADJUST CHAR COUNTER
- LDAX D ; PREPARE TO COMPARE
- CMP C ; IS IT THE NEXT STRING DELIMITER
- JZ GETCH ; YES, GET ANOTHER CHAR
- LDA STRLEN ; LOAD THE STRING LENGTH
- CMP B ; IS IT END-OF-STRING?
- JNZ STRDEL ; NO, KEEP LOOKING
- ;
- ; REACHED THE END-OF-STRING WITHOUT FINDING
- ; THE MATCHING STRING DELIMITER.
- ;
- STRERR:
- MVI A,1 ; SET ERROR FLAG TO TRUE
- STA ERRFLG ;
- JMP FINSTR ; FINISHED
- ;
- ; LOOK FOR OTHER DELIMITERS.
- ;
- CHKDEL:
- MVI C,21 ; INITIALIZE DELIMITER COUNTER
- LXI H,DELIMS ; POINT H-L AT DELIMITER
- CONTDL:
- CMP M ; IS IT A DELIMITER?
- JZ GETCH ; YES, THIS DELIMITER IS USELESS
- ; TO US, SO WE GET ANOTHER CHAR
- INX H ; NO, THEN TRY ANOTHER DELIMITER
- DCR C ; DECREMENT DELIMITER COUNTER
- JNZ CONTDL ; CONTINUE CHECKING FOR DELIMITERS
- ; IF MORE DELIMITERS AVAILABLE
- ;
- ; OUT OF DELIMITERS TO TEST. SO, IT MUST BE
- ; THE FIRST CHARACTER OF A TOKEN.
- ;
- CALL SETOFF ; SAVE THIS POSITION TO OFFSET
- ;
- ; NOW, FIND THE NEXT DELIMITER.
- ;
- NEXTDL║
- INX D ; GET NEXT CHAR IN D-E ADDRESS
- INR B ; INCREMENT STRING COUNTER
- LDA STRLEN ; LOAD THE STRING LENGTH
- CMP B ; IS IT END-OF-STRING?
- JZ FINSTR ; YES, FINISHED
- ;
- MV╔ C,2▒ ╗ INITIALIZ┼ DELIMITE╥ COUNTER
- LXI H,DELIMS ; POINT H-L AT DELIMITERS
- ;
- CHKDL2:
- CMP M ; IS IT A DELIMITER?
- JZ ATOKEN ; YES, EXIT THE ROUTINE, BECAUSE
- ; A TOKEN HAS BEEN TRAPPED
- DCR C ; ANY MORE DELIMITERS TO CHECK?
- JZ NEXTDL ; NO, THIS CHAR MUST BE PART OF
- ; THE TOKEN. THEREFORE, IGNORE
- ; THIS ONE AND GET ANOTHER CHAR
- INX H ; YES, GET NEXT DELIMITER
- JMP CHKDL2 ; AND TEST IT
- ;
- ; REACHED THE END-OF-STRING.
- ;
- FINSTR:
- MVI A,1 ; SET END-OF-STRING FLAG
- STA EOSFLG ; FOR dBASE TO CHECK
- ;
- ATOKEN:
- MOV A,B ; B-REG HAS THE NUM OF CHARS PARSED
- STA SAVPOS ; SAVE THE LAST POSITION
- ;
- RESTOR:
- LHLD SAVEHL ; RESTORE H-L REGISTERS
- RET ; RETURN TO dBASE II
- ; -----------------------------------------------------------
- ;
- ; SAVE OFFSET POSITION.
- ;
- SETOFF:
- LDA SAVPOS ; LOAD PREVIOUS POSITION
- SUB B ; SUBTRACT THE CHAR POSITION
- CMA ; CONVERT FROM NEGATIVE TO POSITIVE
- STA OFFSET ; SAVE IT TO THE OFFSET
- RET
- ;
- SAVEHL DB 0,0 ; SAVE H-L REGISTERS
- STRLEN DB 0 ; STRING LENGTH
- DELIMS DB ' ()+-/*,;&$#<>=!@',22H,27H,5BH,5DH
- ;
- END